package com.example.add;

import org.apache.commons.lang3.StringUtils;

/**
 * @author zhy
 * @version 1.0.0
 * @ClassName Solution.java
 * @Description 两个无限大的正整数相加
 * @createTime 2020年11月12日 14:49:00
 */
public class AddSolution {

    /**
     * 思路：把2个数反转，这样就是个位对个位，十位对十位
     * char转integer减去0即可
     * 注意进位的处理
     * 先从长度小的开始处理，处理完长度小的，再接着处理长度大的
     * @param s1
     * @param s2
     * @return
     */
    public static String add(String s1, String s2) {
        if (StringUtils.isBlank(s1)) {
            return s2;
        }
        if (StringUtils.isBlank(s2)) {
            return s1;
        }
        int maxLength = Math.max(s1.length(), s2.length());
        StringBuffer result = new StringBuffer(maxLength + 1);
        int count = 0;// 表示进位
        int minLength = Math.min(s1.length(), s2.length());
        s1 = new StringBuffer(s1).reverse().toString();//
        s2 = new StringBuffer(s2).reverse().toString();
        int curNum = 0;
        int i, temp;
        for (i = 0; i < minLength; i++) {
            temp = s1.charAt(i) - '0' + s2.charAt(i) - '0' + count;
            curNum = temp % 10;
            count = temp / 10;
            result.append(curNum);
        }
        if (s1.length() < s2.length()) {
            s1 = s2;
        }
        for (; i < s1.length(); i++) {
            temp = s1.charAt(i) - '0' + count;
            curNum = temp % 10;
            count = temp / 10;
            result.append(curNum);
        }
        if (count > 0) {
            result.append(count);
        }
        return result.reverse().toString();
    }

    public static String add2(String s1, String s2) {
        if (StringUtils.isBlank(s1)) {
            return s2;
        }
        if (StringUtils.isBlank(s2)) {
            return s1;
        }
        StringBuilder sb = new StringBuilder();
        char[] arr1 = s1.toCharArray();
        char[] arr2 = s2.toCharArray();
        int idx1 = arr1.length - 1;//从最后一位开始处理，即字符串反转
        int idx2 = arr2.length - 1;
        // 缓存是否需要进位
        boolean carry = false;
        // 遍历两个字符串 处理元素相加
        while (idx1 >= 0 && idx2 >= 0) {
            char cur1 = arr1[idx1];
            char cur2 = arr2[idx2];
            // 相加
            int sum = cur1 - '0' + cur2 - '0';
            sum = carry ? sum + 1 : sum;
            carry = sum >= 10 ? true : false;
            sb.append((char) ((sum % 10) + '0'));
            idx1--;
            idx2--;
        }
        // 处理剩余的元素
        while (carry || idx1 >= 0 || idx2 >= 0) {
            if (idx1 >= 0) {
                // 当前元素处理
                int sum = arr1[idx1] - '0' + (carry ? 1 : 0);
                // 下次是否需要进位
                carry = sum >= 10 ? true : false;
                sb.append((char) ((sum % 10) + '0'));
                idx1--;
            } else if (idx2 >= 0) {
                int sum = arr2[idx2] - '0' + (carry ? 1 : 0);
                carry = sum >= 10 ? true : false;
                sb.append((char) ((sum % 10) + '0'));
                idx2--;
            } else {
                sb.append("1");
                carry = false;
            }
        }
        return sb.reverse().toString();
    }

    public static void main(String[] args) {
        String s1 = "12345678";
        String s2 = "5678";
        System.out.println(add(s1, s2));

        System.out.println(add2("111111119111111111", "9"));
    }
}
